#ifndef CHATWIDGET_H
#define CHATWIDGET_H

#include <QWidget>
#include <QLayout>
#include <QScrollArea>
#include <QScrollBar>
#include "UserLayer/External/enumlib.h"
#include "UserLayer/External/pagemanger.h"
#include "UserLayer/GUI/ChatWidget/recvbox.h"
#include "UserLayer/GUI/ChatWidget/sendbox.h"
#include "UserLayer/GUI/ChatWidget/friendlistbox.h"
#include "UserLayer/GUI/SendFileWidget/sendfilewidget.h"
#include "UserLayer/GUI/ChatWidget/sendfilebox.h"
#include "UserLayer/GUI/ChatWidget/recvfilebox.h"
#include "UserLayer/GUI/CameraWidget/camerawidget.h"
#include "AbstractLayer/Network/threadmanger.h"
#include "AbstractLayer/Database/chathistroy.h"
#include <QEvent>
#include <QHash>
#include <QSet>
#include <QDate>
#include <QQueue>
#include <QMediaPlayer>
#include <QPixmapCache>
#include <QImageReader>
namespace Ui {
class ChatWidget;
}

class ChatWidget : public QWidget
{
    Q_OBJECT
    enum Dir{
        FRONT,//前插
        BACK,//后插
    };

public:
    explicit ChatWidget(QWidget *parent = nullptr);
    ~ChatWidget();
    //添加文本气泡,传入oc号即可
    void addMessageBox(const QString oc,const QString content,EnumLib::MessageType type,const Dir dir);
    //添加好友列表项
    void addFriendListBox(const QString oc,const QString name,const QString content);
    //添加文件气泡
    void addFileBox(const QPixmap avatar,const QPixmap,const QString filename,const EnumLib::MessageType type,const Dir dir);
    //获取聊天记录有变化的oc号，为了更新最新消息
    static QSet<QString> getChangeSet();
    //设置当前的会话，即设置聊天记录缓存和新消息缓存，新消息立即写入
    void setCurrentMeeting(QString oc);

    void setMedia(int val);

    int getTmpCount();

    void removeFriend(const QStringList& friendoclist);

    void clearAll();
private slots:
    //发送按钮
    void on_btn_send_clicked();
    //选择文件按钮
    void on_btn_file_clicked();
    //发送文件的槽函数，发送文件且更新到消息界面
    void sendFile(QStringList paths);

    void on_btn_camera_clicked();

    void sendCameraPhoto(QImage);

    void onScrollBarValueChanged(int value);
    //将库中记录加载到界面
    void loadChatHistroy();
    //将库中消息列表加载到界面
    void loadFriendList();

    void on_listWidget_friend_itemClicked(QListWidgetItem *item);
    //加载最新的消息
    void loadLastestMes(QPair<QString, QString>);

    QString checkIsExist(QString filepath,QString filename,QString lastpath);

    void dealRecvFile(const QString& friendoc,const QString& content);

    void on_listWidget_customContextMenuRequested(const QPoint &pos);

    void addFileFavorite(QString,QString,QString);


    void on_listWidget_friend_customContextMenuRequested(const QPoint &pos);

    //隐藏会话
    void hideChat();
    //删除会话
    void deleteChat();

    void emptyChatFrame();

    void inChattingFrame();

signals:

    void s_subCount(int);
    void s_addCount();
    void s_clearTitle();
protected:
    //事件过滤器，回车发送
    bool eventFilter(QObject *obj, QEvent *e);
private:
    void moveItemToTop(const int index,const QString& content);
private:
    Ui::ChatWidget *ui;
    //维护选择发送文件窗口
    SendFileWidget *sendfilewidget;
    CameraWidget *camerawidget;
    //为了快速定位friendbox，为了消息提示
    QHash<QString,int> friendocindexlist;
    //好友列表的维护，为了能够使用消息列表的自定义控件中绑定的oc和name
    QList<FriendListBox*> friendboxlist;
    //为了更新记录的时候，滚轮保持在原位，记录变化前的item，更新后定位
    QListWidgetItem* currentitem;
    //记录变化了的oc号，为了优化关闭时写入最新表，不用全遍历
    static QSet<QString> changeset;
    //记录是否为第一次加载
    bool flag;
    //记录当前聊天的oc号及昵称
    QString currentOC;

    QString username;
    QString useroc;
    QString currentName;
    QListWidgetItem* currentfrienditem;
    SendFileBox* currentfilebox;
    QMediaPlayer* player;

    int tmpcount=0;

    bool enter;
    bool newmessagering;
    int ring;
};

#endif // CHATWIDGET_H
